perm filename NS2[F8,ALS] blob sn#321378 filedate 1977-12-15 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	*
C00027 ENDMK
C⊗;
*
WMCA    DC   H'A'    YOUR MOVE! 0
        DC   YRMV:
        DC   YRMV.
        DC   H'A'    MUST JUMP 1
        DC   MJM:
        DC   MJM.
        DC   H'D'    ILLEGAL MOVE 2
        DC   MIM:
        DC   MIM.
        DC   H'8'    TOO FAR 3
        DC   TFM:
        DC   TFM.
        DC   H'7'    MY MOVE 4
        DC   MYMV:
        DC   MYMV.
        DC   H'0A'   TRY AGAIN! 5
        DC   PCMM:
        DC   PCMM.
        DC   H'D'    CONTINUE JUMP 6
        DC   CJM:
        DC   CJM.
        DC   H'9'    I WIN IN 7
        DC   IWIN:
        DC   IWIN.
        DC   H'B'    YOU WIN IN 8
        DC   UWIN:
        DC   UWIN.
YRMV    DC   H'0513' YOur move
        DC   H'0309' UR
        DC   H'0'    SPACE
        DC   H'2913' MO
        DC   H'2F0B' VE
        DC   H'04'   !
MJM     DC   H'2903' MUst jump
        DC   H'2107' ST
        DC   H'0'    SPACE
        DC   H'1703' JU
        DC   H'2925' MP
        DC   H'04'   !
MIM     DC   H'0127' ILlegal move
        DC   H'270B' LE
        DC   H'1B11' GA
        DC   H'2700' L SPACE
        DC   H'2913' MO
        DC   H'2F0B' VE
        DC   H'04'   !
TFM     DC   H'0713' TO far
        DC   H'1300' O SPACE
        DC   H'1D11' FA
        DC   H'0904' R!
MYMV    DC   H'2905' MY move
        DC   H'0'    -
        DC   H'2913' MO
        DC   H'2F0B' VE
PCMM    DC   H'0709' TRY AGAIN!
        DC   H'0500'
        DC   H'111B'
        DC   H'1101'
        DC   H'2B04'
CJM     DC   H'3113' CONTINUE JUMP
        DC   H'2B07'
        DC   H'012B'
        DC   H'030B'
        DC   H'0'
        DC   H'1703'
        DC   H'2925'
IWIN    DC   H'0100' I WIN IN
        DC   H'0D01'
        DC   H'2B00'
        DC   H'012B'
        DC   H'0'
UWIN    DC   H'0513' YOU WIN IN
        DC   H'0300'
        DC   H'0D01'
        DC   H'2B00'
        DC   H'012B'
        DC   H'0'
*-*-*- Read keyboard
RKB     LR   K,P     Read keyboard
        PI   PUSH
        LISU 2
        LISL 4       SET ISAR FOR DELAY TIMER
        LIS  H'0'
        LR   S,A     SET FOR MAX DELAY
RKB1    PI   FCS     FETCH CHARACTER
        BZ   RKB1    NULL INPUT?
        BM   RKB1    NO. DEBOUNCED INPUT?
        PI   POPS    YES. POP RETURN ADDRESS
        LR   A,8     GET KEYBOARD INPUT
        PK           AND RETURN
*-*-*- Initial moves for black
BLKM    DC   B'11110000' 4 pieces
        DC   B'00000100' Byte 1, RF
        DC   B'11100000' 3 pieces
        DC   B'00000101' Byte 1, LF
        DC   B'01000000' 11-15 repeat to give
        DC   B'00000100' a slight preference
        DC   H'00'
*-*-*- Generate board image
BORD    LR   K,P
        CLR
        COM
        LR   3,A     REG3=FF
        DCI  OBJ0    BRD1 START ADDRESS
        LIS  H'2'    FLAG FOR BOR
        LR   4,A     SET REG 4 = 2
        LIS  H'6'
BRD4    LR   0,A     REG0 = 6 ROWS
BRD3    LIS  H'A'
        LR   1,A     REG 1 = 10 LINE/ROW
BRD2    LIS  H'4'
        LR   2,A     REG2=SQ PAIRS/ROW
BRD1    LR   A,3
        ST           STORE IN BRD
        COM
        ST           NEXT IS COMPL. OF FIRST
        DS   2
        BNZ  BRD1    MORE FOR THIS ROW
        DS   1       NO, ALL LINE DONE
        BNZ  BRD2
        LR   A,3     DONE A TIMES YET
        COM
        LR   3,A
        DS   0       DEC ROW COUNT
        BNZ  BRD3    ALL ROWS DONE?
        DS   4
        BZ   BRD5    BOTH OBJECTS DONE?
        DCI  OBJ1    NO,GET BORD2 ADDRS.
        LIS  H'2'
        BR   BRD4    REG0=2
*-*-*- Now put pieces in image
BRD5    LISU 3       Pieces are here
        LIS  H'1'    1 for red pieces (stored first)
        LR   4,A     Piece, (1 Red, 0 Black, -1 King)
        DCI  COL0
        CLR          CLEAR ACC
        XM           IN W/STATUS
        LR   0,A
        LISL O'7'    Decrement and shift right
        BNZ  MEN1    if COL0 is FF (BLACK at bottom of scree
        LISL O'0'    Increment and shift left
MEN1    LIS  H'3'    if COL0 is 0 (Black at top of screen)
        LR   1,A     To count bytes
MEN2    LIS  H'7'
        LR   2,A     To count bits
        DCI  TAB1    Byte location table
        LR   A,1     This byte number
        SL   1       Locations occupy 2 bytes each
        ADC
        LM           Get the byte location
        LR   QU,A    and save it in Q
        LM
        LR   QL,A
        LR   A,0
        NS   0
        BNZ  MEN5    Decrement and shift right if COL0 is FF
        LR   A,I     Increment and shift left if COL0 is 0
        BR   MEN4
MEN3    LR   A,3
        SL   1       and shift left
MEN4    LR   3,A
        NI   H'80'   (done this way for symry
        BZ   MEN9
        BR   MEN8
MEN5    LR   A,D     Decrement if COL0 is FF
        BR   MEN7
MEN6    LR   A,3
        SR   1       and shift right
MEN7    LR   3,A
        NI   H'1'
        BZ   MEN9
MEN8    DCI  TAB2    Relative-locations-of-squares table
        LR   A,2     This square
        ADC
        LM           Get square displacement
        LR   DC,Q    Recall the location for the input byte
        ADC          This is the square position
        LR   A,4     Identify type of piece
        NS   4
        BM   PUTK    To put down a king
        LIS  H'4'    Prepare for a piece
        LR   5,A     To count lines
        LI   H'20'   Skip the rst 4 lines (4*8)
        ADC
        XDC
        DCI  BLKP    Anticipate a black piece
        BZ   PUTL    A black piece (status bit still ok)
        DCI  REDP    No, it's a red piece
        BR   PUTL
PUTK    LIS  H'2'    Only 3 lines for a crown
        LR   5,A
        LIS  H'8'    To skip 1 line
        ADC
        XDC
        DCI  KING
PUTL    LM           Put loop
        XDC
        ST
        LIS  H'7'    To next line on screen (less increment)
        ADC
        XDC
        DS   5
        BP   PUTL    Loop
MEN9    DS   2
        BM   ME10
        LR   A,0
        NS   0
        BNZ  MEN6    Shift right if COL0 is FF
        BR   MEN3    Shift left if COL0 is 0
ME10    DS   1
        BP   MEN2
        LR   A,4
        NS   4
        BM   BDEX    Exit from board routine
        DS   4
        BP   MEN1    Go round again for black pieces
        LISU H'4'    Get set for kings
        LR   A,0
        NS   0
        LISL H'3'    Decrementing case
        BNZ  MEN1    Dedrement and shift right if COL0 is FF
        LISL H'0'    Incrementing case
        BR   MEN1    Increment and shift left if COL0 is 0
BDEX    PK
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
* UPDATE CONTROL DATA *
*
BDAT    DC   H'1'    FLAG SET SHORT UPDATE
        DC   UDIT:
        DC   UDIT.
        DC   UDIT:
        DC   UDIT.
* Set message length and line pointer
SEDC    DCI  LINE    DCO TO LINE POINTER
        LIS  H'2'
        SL   4       SET FOR SECOND LINE
        ST
        LR   A,0
        SL   4
        LISL 4
        LR   S,A     AND SET MESSAGE LENGTH
        CLR          CLEAR ACC
        LR   1,A     AND SET DEFAULT RESULT
        POP          AND RETURN
*-*-*- Address table for MVC*
TABL    DC   H'0C30'
        DC   H'0C80'
        DC   H'0CD0'
        DC   H'0D20'
        DC   H'0D70'
        DC   H'0DC0'
        DC   H'0F10'
        DC   H'0F60'
*-*-*- To move cursor, uses
*SC0,1,2,3,4,HU,Q,K,W, SC20-24.
CURS    LR   K,P
        PI   PUSH    AND PUSH IT ON TO STACK
MAP0    PI   MWAD    WAIT, THEN UPDATE
        LIS  H'1'    CAN START JOYREAD
        LR   HU,A    SET FOR HORIZONTAL POT
        PI   JOYI    AND READ
        LR   VX,A    SAVE RESULT IN VX
        LIS  H'0'
        LR   HU,A    SET FOR VERTICAL POT
        PI   JOYI
        LR   0,A     SAVE IN REG 0
        PI   AMAP    CONVERT TO PROPER VELOCITY
        LR   VY,A    SAVE RESULT
        LR   A,VX
        LR   0,A     NOW GET UNCOVERTED VX INTO R0
        PI   AMAP    CONVERT IT
        LR   VX,A    AND SAVE IT
        PI   MWAD    WAIT, THEN UPDATE
        PI   BLNK    To blink code (on)
        LIS  H'4'
        LR   0,A
MP01    PI   MWAD    A second wait
        DS   0
        BNZ  MP01
        PI   BLNK    To blink code (off)
        CLR          CLEAR ACC
        XS   VX      VX IN W/STATUS
        BZ   MAP7    NON-NULL X COMPONENT?
        DCI  XPOS    YES
        LM
        LR   X,A     SET CURRENT X POSITION
        LISU 2
        LISL 0
        CLR
        LR   I,A     SP20<=0
        LM
        LR   I,A     SP21<=NON NULL LEAD MASK
        LM
        LR   S,A     SP22<=TRAILING MASK
        CLR
        XS   VX      VX IN W/STATUS
        BM   MAP3    GOING LEFT?
        PI   SHR     SHIFT RIGHT ONE
        LIS  H'7'    NO, GOING RIGHT.
        XS   X
        BNZ  MAP5    IN RH MOST BOX?
        LISL 2       YES
        XS   S
        BZ   MAP5    TRIED TO GO TOO FAR?
MAP2    CLR  YES.
        LR   VX,A    CLEAR X VELOCITY
        BR   MAP7    AND CHECK Y
MAP3    PI   SHL     SHIFT LEFT ONE
        CLR
        XS   X
        BNZ  MAP4    IN LH MOST BOX?
        LISL 0       YES
        XS   S
        BNZ  MAP2    TRIED TO GO TOO FAR?
MAP4    LISL 0
        CLR
        XS   S
        BZ   MAP7    IS SP20 NULL?
        LISL 1       NO.
        LR   A,I
        LR   S,A
        LISL 0
        LR   A,I
        LR   D,A
        CLR
        LR   S,A     SP22<=SP21,SP21<=SP20,SP20<=0,THAT ORDER
        DS   X       AND DECREMENT X COUNT
        BR   MAP7    NOW GO CHECK Y
MAP5    LISL 1
        CLR          CLEAR ACC
        XS   S
        BNZ  MAP7    IS SP21=0?
        LISL 2
        LR   A,D
        LR   I,A
        CLR
        LR   D,A     SP21<=SP22,SP22<=0, THAT ORDER
        LIS  H'1'
        AS   X
        LR   X,A     INCREMENT X COUNT
MAP7    CLR
        XS   VY
        BZ   MAP9    VY=0?
        DCI  YPOS    NO, SET DCO TO LAST Y POSITION
        AM           UPDATE Y COORD
        BM   MP7A    Result Y is neg?
        CI   MAXY    COMPARE W/MAX ALLOWED Y
        BC   MAP8    NEW Y>MAX ALLOWED VALUE?
MP7A    CLR  YES
        LR   VY,A    RESET VY
        BR   MAP9
MAP8    LR   Y,A     SET NEW Y
MAP9    LR   A,VY    GET VY
        SL   1
        XS   VX
        BZ   MP12    ANY MOVEMENT?
        PI   MVC     YES, REMOVE OLD POSITION
        CLR
        XS   VY
        BZ   MP10    ANY Y MOVEMENT?IF NOT, MUST HAVE VX NE 0
        DCI  YPOS
        LR   A,Y     IS, SO RESET
        ST           Y POSITION
        CLR
        XS   VX
        BZ   MP11    ANY X MOVEMENT?
MP10    DCI  XPOS    UPDATE X POSIT & MASK
        LR   A,X
        ST
        LISL 1
        LR   A,I
        ST
        LR   A,S
        ST
MP11    PI   MVC     DISPLAY NEW POSITION
MP12    CLR
        OUTS 1       Clear port 1
        NOP          3 NOP's for FCC
        NOP          Do not remove
        NOP          for any reason
        INS  1       Get buttons
        NI   H'1'    Strip to desired one
        DCI  BFLG    To button flag
        CLR
        BNZ  MP13    Any button input?
        ST           No, reset edge flag
MP14    JMP  MAP0    And go try again
MP13    LR   Q,DC    Save address
        XM           Flag in W/STATUS
        BNZ  MP14    Previous input?
        LIS  H'1'    No, reset flag
        LR   DC,Q    Recover address
        ST           And reset
CON     CLR
        LR   0,A     Set counter (Y conversion)
CON1    LR   A,Y     Get Y coordinate
        CI   YTST    Compare W/test value
        BC   CON2    Y LE test value?
        LR   A,0     No, increment counter
        INC
        LR   0,A
        LI   -H'A'
        AS   Y
        LR   Y,A     Y<=Y-H'A'
        BR   CON1    Go back and try agian
CON2    LR   A,0     Get counter
        LR   Y,A     Y now↑(0-7):(top-bottom)
        AS   X
        NI   H'1'
        BZ   MP14    On a legal square?
        DCI  COL0    Yes
        CLR
        XM           Flag in W/STATUS
        BP   CON3    Machine plays RED?
        LIS  H'7'    Yes
        XS   Y
        LR   Y,A     Y<=7-Y
        LIS  H'7'
        XS   X
        LR   X,A     X<=7-X
CON3    LR   A,Y
        SR   1
        LR   VY,A    VY reg (BYTENO)<=(1/2*(7-Y)
        DCI  BYDT    To BYTE data
        LR   A,X     Get X coord.
        ADC          Add offset to base address
        LM           Get byte
        LR   VX,A    Save byte into VX reg
        DCI  XOLD
        LR   A,X
        ST
        LR   A,Y
        ST           SAVE CONVERTED CO-ORDINATES
        PI   MWAD    WAIT, THEN UPDATE
        PI   ENIN    ENABLE INTERRUPT DRIVEN UPDATE
        PI   POPS    POP RETURN ADDRESS
        PK           AND RETURN
*-*-*- Data for byte values (X coord. conversions)
BYDT    DC   H'0880'
        DC   H'0440'
        DC   H'0220'
        DC   H'0110'
*-*-*- MVC Set or remove cursor
MVC     LR   K,P   SAVE RETURN ADDRESS
        DCI  XPOS
        LM
        LR   0,A     SAVE X IN R0
        LISU 2
        LISL 3
        LM
        LR   I,A
        LM
        LR   D,A     LEAD IN SP23,TRAIL IN SP24
        CI   YPOS
        LM           GET Y COORDINATE
        DCI  H'0C30' DCO TO OBJ0 BASE ADDRESS
        ADC          ADD 8 X Y COORD (W/MAX FOR Y
        ADC          OVER H'40', CANNOT USE "CUTE"
        ADC          TRICKS HERE--AND FOR SPEED,
        ADC          WE JUST USE STRAIGHT ADC'S).
        ADC
        ADC
        ADC
        ADC
        LR   A,0     GET X OFFSET
        ADC          AND ADD IT IN
        LIS  CHT
        LR   0,A     SET COUNT FOR TRANSFER
MVC1    LR   Q,DC    SAVE ADDRESS IN Q REG
        LR   A,QU    GET HO ADDRESS
        CI   H'E'
        BNZ  MVC2    AT BOTTOM OF OBJ0
        LR   A,QL    DEFINITELY.
        CI   H'F'
        BC   MVC2    PAST BOTTOM?
        LIS  H'F'    YES.
        LR   QU,A    RESET HO ADDRESS
        LR   DC,Q    AND RESET DCO ACCORDINGLY (FOR OBJ1)
MVC2    LR   A,I     GET LEAD MASK BYTE
        LR   Q,DC    SAVE DCO
        XM           XOR IN CURSOR
        LR   DC,Q    RECOVER ADDRESS
        ST           AND RESET THAT BYTE
        LR   Q,DC    SAVE ADDRESS AGAIN
        LR   A,D     GET TRAILING MASK BYTE
        XM           XOR IN BITS
        LR   DC,Q    RECOVER ADDRESS
        ST           AND RESET DATA
        LIS  H'6'
        ADC          SET TO NEXT DESTINATION
        DS   0       DECREMENT COUNTER
        BNZ  MVC1    DONE?
        PK           YES, RETURN
*-*-*- AMAP Mapping joystick readings to velocities
AMAP    LR   A,0     GET READING
        CI   H'40'
        BNC  AMP1    VAL LE H'40'?
        LI   H'FF'   YES.
        BR   AMP2
AMP1    CI   H'C0'
        CLR
        BC   AMP2    VAL GT H'C0'=D'192'
        LIS  H'1'    YES, VELOCITY = 1
AMP2    POP          RETURN
*-*-*- BLNK  Blinking routine
BLNK    LR   K,P
        DCI  BLNF    Test BLINK flag
        CLR
        XM
        BZ   BLN4    Need to blink?
        LISU 2
        LISL 3
        LM           Yes
        LR   I,A     Get X value
        LM
        LR   D,A     and Y value to blink
        DCI  COL0
        CLR
        XM
        BZ   BLN0    Need to reverse?
        LIS  H'7'
        XS   S
        LR   I,A
        LIS  H'7'
        XS   S
        LR   D,A
BLN0    DCI  H'0C30'-H'50' DC0 TO OBJ0-H'50'
        LISL 4
        LIS  H'5'
        SL   4
BLN1    ADC          Add off-set
        DS   S
        BP   BLN1    Added enough?
        LR   Q,DC    Yes
        LR   A,QU    Get H0 address
        CI   H'E'
        BNZ  BLN2    Need reset?
        LIS  H'F'    Yes
        LR   QU,A
BLN2    LR   DC,Q
        LISL 3
        LR   A,S
        ADC          Add off-set
        LIS  H'3'
        LR   0,A     Set counter
BLN3    LR   Q,DC
        LI   H'C0'
        XM
        LR   DC,Q